//! MySQL 数据填充示例和使用说明

use dataforge::filling::{ConnectionConfig, FillingConfig, MySqlFillerSync, DatabaseFiller};
use dataforge::error::Result;

/// MySQL 员工表数据填充示例
pub fn mysql_employees_filling_example() -> Result<()> {
    // 1. 创建 MySQL 连接配置
    let connection_config = ConnectionConfig::mysql("localhost", "demo", "root", "Aa123456")
        .with_port(13307)
        .with_param("charset", "utf8mb4")
        .with_param("collation", "utf8mb4_unicode_ci");
    
    // 2. 创建数据填充配置
    let filling_config = FillingConfig {
        batch_size: 100,           // 每批插入100条记录
        use_transaction: true,     // 使用事务
        timeout_seconds: 60,       // 超时时间60秒
        retry_count: 3,           // 重试3次
    };
    
    // 3. 创建 MySQL 填充器
    let mut mysql_filler = MySqlFillerSync::from_config(connection_config, filling_config)?;
    
    // 4. 填充员工数据
    let employee_count = 1000;
    let result = mysql_filler.fill_table("employees", employee_count)?;
    
    // 5. 获取统计信息
    let stats = mysql_filler.get_stats();
    
    // 6. 打印结果
    println!("数据填充完成！");
    println!("成功生成 {} 条员工记录", result);
    println!("统计信息:");
    println!("  - 总记录数: {}", stats.total_rows);
    println!("  - 成功记录数: {}", stats.successful_rows);
    println!("  - 失败记录数: {}", stats.failed_rows);
    println!("  - 处理时间: {} 毫秒", stats.processing_time_ms);
    println!("  - 平均速度: {:.2} 行/秒", stats.rows_per_second);
    
    Ok(())
}

/// 创建员工表的 SQL 语句示例
pub fn create_employees_table_sql() -> &'static str {
    r#"
CREATE TABLE IF NOT EXISTS employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    emp_no INT UNIQUE NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    gender ENUM('M', 'F') NOT NULL,
    birth_date DATE NOT NULL,
    hire_date DATE NOT NULL,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20),
    salary INT,
    department VARCHAR(50),
    position VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
"#
}

/// 小批量数据填充示例（用于测试）
pub fn small_batch_example() -> Result<()> {
    let connection_config = ConnectionConfig::mysql("localhost", "demo", "root", "Aa123456")
        .with_port(13307);
    
    let filling_config = FillingConfig {
        batch_size: 10,
        use_transaction: false,
        timeout_seconds: 30,
        retry_count: 1,
    };
    
    let mut filler = MySqlFillerSync::from_config(connection_config, filling_config)?;
    
    // 生成少量数据用于快速测试
    let result = filler.fill_table("employees", 20)?;
    println!("小批量填充完成，生成 {} 条记录", result);
    
    Ok(())
}

/// 性能测试示例
pub fn performance_test_example() -> Result<()> {
    let connection_config = ConnectionConfig::mysql("localhost", "demo", "root", "Aa123456")
        .with_port(13307);
    
    // 测试不同批次大小对性能的影响
    let batch_sizes = [50, 100, 500, 1000];
    let test_record_count = 1000;
    
    for &batch_size in &batch_sizes {
        let filling_config = FillingConfig {
            batch_size,
            use_transaction: true,
            timeout_seconds: 60,
            retry_count: 1,
        };
        
        let mut filler = MySqlFillerSync::from_config(connection_config.clone(), filling_config)?;
        
        let start_time = std::time::Instant::now();
        let result = filler.fill_table("employees", test_record_count)?;
        let duration = start_time.elapsed();
        
        let stats = filler.get_stats();
        
        println!("批次大小: {}, 记录数: {}, 耗时: {:?}, 速度: {:.2} 行/秒", 
                 batch_size, result, duration, stats.rows_per_second);
    }
    
    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_create_table_sql() {
        let sql = create_employees_table_sql();
        assert!(sql.contains("CREATE TABLE"));
        assert!(sql.contains("employees"));
        assert!(sql.contains("emp_no"));
        assert!(sql.contains("first_name"));
        assert!(sql.contains("last_name"));
    }

    #[test] 
    fn test_small_batch_example() {
        let result = small_batch_example();
        assert!(result.is_ok());
    }

    #[test]
    fn test_mysql_employees_filling_example() {
        let result = mysql_employees_filling_example();
        assert!(result.is_ok());
    }
}

/// 主函数示例
fn main() -> Result<()> {
    println!("DataForge MySQL 数据填充示例");
    println!("==============================");
    
    // 打印建表 SQL
    println!("1. 请先在 MySQL 中执行以下 SQL 创建 employees 表：");
    println!("{}", create_employees_table_sql());
    
    // 运行小批量示例
    println!("2. 运行小批量填充示例：");
    small_batch_example()?;
    
    // 运行完整示例
    println!("3. 运行完整填充示例：");
    mysql_employees_filling_example()?;
    
    // 运行性能测试
    println!("4. 运行性能测试：");
    performance_test_example()?;
    
    println!("所有示例运行完成！");
    Ok(())
}